package tp3;
import tp3.Cuadra;


import java.util.ArrayList;
import java.util.List;


public class Tablero {
	private List<Esquina> esquinas;
	private List<Cuadra> cuadras;
	private int alto;
	private int ancho;
	private Esquina esquinaInicial;
	private Esquina esquinaFinal;
	private int cantMaxMovimientos; 
	private int factorPuntos;
	
	public Tablero(int alto, int ancho){
		this.alto = alto;
		this.ancho = ancho;
		cuadras = new ArrayList<Cuadra>();
		esquinas = new ArrayList<Esquina>();
		asiganarIzquierdaDerecha();
		asignarArribaAbajo();		
	}
	
	private void asiganarIzquierdaDerecha(){
		Esquina esquinaAnterior;
		//agrego una nueva fila
		for (int i = 0; i < alto; i++){
			Esquina esquinaA = new Esquina();
			esquinas.add(esquinaA);
			esquinaAnterior = esquinaA;
			//agrego los elementos de la fila
			for (int j = 0; j < ancho-1; j++){
				Esquina esquinaB = new Esquina();
				Cuadra unaCuadra = new Cuadra();
				//esquinaAnterior.setDer(esquinaB);
				esquinaAnterior.setCuadraDer(unaCuadra);
				//esquinaB.setIzq(esquinaAnterior);
				esquinaB.setCuadraIzq(unaCuadra);
				esquinas.add(esquinaB);
				//ver si funciona
				unaCuadra.setEsquinas(esquinaAnterior, esquinaB);
				//guardarCuadra(esquinaAnterior,esquinaB);
				cuadras.add(unaCuadra);
				esquinaAnterior = esquinaB;
			}
		}
	}
	
	private void asignarArribaAbajo(){
		int posActual = (alto*ancho)-1;
		int posAnterior = posActual-ancho;
		Esquina esquinaActual;
		Esquina esquinaAnterior;
		
		//termino el cableado entre nodos
		while (posAnterior >= ancho-1){
			esquinaAnterior = esquinas.get(posAnterior);
			esquinaActual = esquinas.get(posActual);
			//recorro una fila
			for (int i= 0 ; i<= ancho-1; i++){
				Cuadra unaCuadra = new Cuadra();
				esquinaActual.setCuadraArriba(unaCuadra);
				esquinaAnterior.setCuadraAbajo(unaCuadra);
				unaCuadra.setEsquinas(esquinaActual,esquinaAnterior);
				cuadras.add(unaCuadra);
				esquinaAnterior = esquinaAnterior.getCuadraIzq().esquinaOpuesta(esquinaAnterior);
				esquinaActual = esquinaActual.getCuadraIzq().esquinaOpuesta(esquinaActual);	
			}
			posActual = posAnterior;
			posAnterior = posActual-ancho; 
		}
	}
	
	public void setEsquinaInicial(Esquina esquinaIni){
		this.esquinaInicial = esquinaIni;
	}
	
	public void setEsquinaFinal(Esquina esquinaFin){
		this.esquinaFinal = esquinaFin;
	}
	
	public Esquina getEsquinaInicial(){
		return this.esquinaInicial;
	}
	public Esquina getEsquinaFinal(){
		return this.esquinaFinal;
	}
	public List<Cuadra> getCuadras(){
		return cuadras;
	}
	public Esquina getPoss (int unaPosicion){
		return esquinas.get(unaPosicion);
	}
	public int tamanio(){
		return esquinas.size();
	}
	public List<Esquina> getEsquinas(){
		
		return this.esquinas;
		
	}
	
	public int getAlto(){
		
		return this.alto;
	}

	public int getAncho(){
		
		return this.ancho;
	}

	public int getColumnaEsquina(Esquina esquina){
		return (esquinas.indexOf(esquina)/this.ancho);
	}

	public int getFilaEsquina(Esquina esquina){
		return (esquinas.indexOf(esquina)%this.ancho);
	}
	
	public float getFilaCuadra(Cuadra cuadra){
		return (float)(this.getFilaEsquina(cuadra.getEsquinaInicial()) + this.getFilaEsquina(cuadra.getEsquinaFinal())) / 2;
	}
	
	public float getColumnaCuadra(Cuadra cuadra){
		return (float)(this.getColumnaEsquina(cuadra.getEsquinaInicial()) + this.getColumnaEsquina(cuadra.getEsquinaFinal())) / 2;
	}

	public int getCantMaxMovimientos(){
		return cantMaxMovimientos;
	}
	public void setCantMaxMovimientos(int cantidad){
		cantMaxMovimientos = cantidad;
	}
	public int getFactorPuntos(){
		return factorPuntos;
	}
	public void setFactorPuntos(int factor){
		factorPuntos = factor;
	}
	
}
